home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / rcs5ap1s.lzh / RCSFNMS.C < prev    next >
C/C++ Source or Header  |  1991-01-30  |  34KB  |  1,227 lines

  1. /*
  2.  *                     RCS file name handling
  3.  */
  4. /****************************************************************************
  5.  *                     creation and deletion of /tmp temporaries
  6.  *                     pairing of RCS file names and working file names.
  7.  *                     Testprogram: define PAIRTEST
  8.  ****************************************************************************
  9.  */
  10.  
  11. /* Copyright (C) 1982, 1988, 1989 Walter Tichy
  12.    Copyright 1990 by Paul Eggert
  13.    Distributed under license by the Free Software Foundation, Inc.
  14.  
  15. This file is part of RCS.
  16.  
  17. RCS is free software; you can redistribute it and/or modify
  18. it under the terms of the GNU General Public License as published by
  19. the Free Software Foundation; either version 1, or (at your option)
  20. any later version.
  21.  
  22. RCS is distributed in the hope that it will be useful,
  23. but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25. GNU General Public License for more details.
  26.  
  27. You should have received a copy of the GNU General Public License
  28. along with RCS; see the file COPYING.  If not, write to
  29. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  30.  
  31. Report problems and direct all questions to:
  32.  
  33.     rcs-bugs@cs.purdue.edu
  34.  
  35. */
  36.  
  37.  
  38.  
  39.  
  40. /* $Log: rcsfnms.c,v $
  41.  * Revision 5.7  1991/01/30  14:13:06  apratt
  42.  * Fixed a bug: bindex returns ptr to char PAST match if there's a match.
  43.  *
  44.  * Revision 5.7  1991/01/30  14:11:14  apratt
  45.  * Fixed a bug: bindex returns ptr to char PAST match if there's a match.
  46.  *
  47.  * Revision 5.6  91/01/29  17:45:54  apratt
  48.  * Added AKP_BUGFIXES around my bug fixes, changed headstr
  49.  * 
  50.  * Revision 5.5  91/01/16  15:45:00  apratt
  51.  * This version works passably on the ST.
  52.  * 
  53.  * Revision 5.4  90/11/01  05:03:43  eggert
  54.  * checked in with -k by apratt at 91.01.10.13.15.14.
  55.  * 
  56.  * Revision 5.4  1990/11/01  05:03:43  eggert
  57.  * Permit arbitrary data in comment leaders.
  58.  *
  59.  * Revision 5.3  1990/09/14  22:56:16  hammer
  60.  * added more filename extensions and their comment leaders
  61.  *
  62.  * Revision 5.2  1990/09/04  08:02:23  eggert
  63.  * Fix typo when !RCSSEP.
  64.  *
  65.  * Revision 5.1  1990/08/29  07:13:59  eggert
  66.  * Work around buggy compilers with defective argument promotion.
  67.  *
  68.  * Revision 5.0  1990/08/22  08:12:50  eggert
  69.  * Ignore signals when manipulating the semaphore file.
  70.  * Modernize list of file name extensions.
  71.  * Permit paths of arbitrary length.  Beware file names beginning with "-".
  72.  * Remove compile-time limits; use malloc instead.
  73.  * Permit dates past 1999/12/31.  Make lock and temp files faster and safer.
  74.  * Ansify and Posixate.
  75.  * Don't use access().  Fix test for non-regular files.  Tune.
  76.  *
  77.  * Revision 4.8  89/05/01  15:09:41  narten
  78.  * changed getwd to not stat empty directories.
  79.  * 
  80.  * Revision 4.7  88/08/09  19:12:53  eggert
  81.  * Fix troff macro comment leader bug; add Prolog; allow cc -R; remove lint.
  82.  * 
  83.  * Revision 4.6  87/12/18  11:40:23  narten
  84.  * additional file types added from 4.3 BSD version, and SPARC assembler
  85.  * comment character added. Also, more lint cleanups. (Guy Harris)
  86.  * 
  87.  * Revision 4.5  87/10/18  10:34:16  narten
  88.  * Updating version numbers. Changes relative to 1.1 actually relative
  89.  * to verion 4.3
  90.  * 
  91.  * Revision 1.3  87/03/27  14:22:21  jenkins
  92.  * Port to suns
  93.  * 
  94.  * Revision 1.2  85/06/26  07:34:28  svb
  95.  * Comment leader '% ' for '*.tex' files added.
  96.  * 
  97.  * Revision 4.3  83/12/15  12:26:48  wft
  98.  * Added check for KDELIM in file names to pairfilenames().
  99.  * 
  100.  * Revision 4.2  83/12/02  22:47:45  wft
  101.  * Added csh, red, and sl file name suffixes.
  102.  * 
  103.  * Revision 4.1  83/05/11  16:23:39  wft
  104.  * Added initialization of Dbranch to InitAdmin(). Canged pairfilenames():
  105.  * 1. added copying of path from workfile to RCS file, if RCS file is omitted;
  106.  * 2. added getting the file status of RCS and working files;
  107.  * 3. added ignoring of directories.
  108.  * 
  109.  * Revision 3.7  83/05/11  15:01:58  wft
  110.  * Added comtable[] which pairs file name suffixes with comment leaders;
  111.  * updated InitAdmin() accordingly.
  112.  * 
  113.  * Revision 3.6  83/04/05  14:47:36  wft
  114.  * fixed Suffix in InitAdmin().
  115.  * 
  116.  * Revision 3.5  83/01/17  18:01:04  wft
  117.  * Added getwd() and rename(); these can be removed by defining
  118.  * V4_2BSD, since they are not needed in 4.2 bsd.
  119.  * Changed sys/param.h to sys/types.h.
  120.  *
  121.  * Revision 3.4  82/12/08  21:55:20  wft
  122.  * removed unused variable.
  123.  *
  124.  * Revision 3.3  82/11/28  20:31:37  wft
  125.  * Changed mktempfile() to store the generated file names.
  126.  * Changed getfullRCSname() to store the file and pathname, and to
  127.  * delete leading "../" and "./".
  128.  *
  129.  * Revision 3.2  82/11/12  14:29:40  wft
  130.  * changed pairfilenames() to handle file.sfx,v; also deleted checkpathnosfx(),
  131.  * checksuffix(), checkfullpath(). Semaphore name generation updated.
  132.  * mktempfile() now checks for nil path; freefilename initialized properly.
  133.  * Added Suffix .h to InitAdmin. Added testprogram PAIRTEST.
  134.  * Moved rmsema, trysema, trydiraccess, getfullRCSname from rcsutil.c to here.
  135.  *
  136.  * Revision 3.1  82/10/18  14:51:28  wft
  137.  * InitAdmin() now initializes StrictLocks=STRICT_LOCKING (def. in rcsbase.h).
  138.  * renamed checkpath() to checkfullpath().
  139.  */
  140.  
  141.  
  142. #include "rcsbase.h"
  143.  
  144. libId(fnmsId, "$Id: rcsfnms.c,v 5.7 1991/01/30 14:13:06 apratt Exp $")
  145.  
  146. const char *RCSfilename;
  147. char *workfilename;
  148. struct stat RCSstat, workstat; /* file status for RCS file and working file */
  149. int haveworkstat;
  150.  
  151. #if !USE_AKP_PAIRS
  152. static const char rcsdir[] = RCSDIR;
  153. #endif
  154.  
  155. #define TEMPNAMES 4 /* must be at least DIRTEMPNAMES (see rcsedit.c) */
  156. static char tfnames[TEMPNAMES][L_tmpnam];    /* unlink these when done */
  157. static volatile int tfmade[TEMPNAMES];        /* if these flags are set */
  158.  
  159.  
  160. struct compair {
  161.     const char *suffix, *comlead;
  162. };
  163.  
  164. static const struct compair comtable[] = {
  165. /* comtable pairs each filename suffix with a comment leader. The comment   */
  166. /* leader is placed before each line generated by the $Log keyword. This    */
  167. /* table is used to guess the proper comment leader from the working file's */
  168. /* suffix during initial ci (see InitAdmin()). Comment leaders are needed   */
  169. /* for languages without multiline comments; for others they are optional.  */
  170.     "a",   "-- ",   /* Ada         */
  171.         "c",   " * ",   /* C           */
  172.     "C",   "// ",    /* C++ in all its infinite guises */
  173.     "CC",  "// ",
  174.     "c++", "// ",
  175.     "cc",  "// ",
  176.     "cxx", "// ",
  177.     "cl",  ";;; ",  /* Common Lisp */
  178.     "cmf", "C ",    /* CM FORTRAN  */
  179.     "cs",  " * ",    /* C*          */
  180.     "el",  "; ",    /* Emacs Lisp  */
  181.     "f",   "c ",    /* Fortran     */
  182.     "for", "c ",
  183.         "h",   " * ",   /* C-header    */
  184.         "l",   " * ",   /* lex      NOTE: conflict between lex and franzlisp */
  185.     "lisp",";;; ",    /* Lucid Lisp  */
  186.         "mac", "; ",    /* macro       vms or dec-20 or pdp-11 macro */
  187.     "me",  ".\\\" ",/* me-macros   t/nroff*/
  188.     "ml",  "; ",    /* mocklisp    */
  189.     "mm",  ".\\\" ",/* mm-macros   t/nroff*/
  190.     "ms",  ".\\\" ",/* ms-macros   t/nroff*/
  191.     "p",   " * ",   /* Pascal      */
  192.     "pl",  "% ",    /* Prolog      */
  193.     "tex", "% ",    /* TeX           */
  194.         "y",   " * ",   /* yacc        */
  195.     nil,   "# "     /* default for unknown suffix; must always be last */
  196. };
  197.  
  198.  
  199.     void
  200. ffclose(fptr)
  201. FILE * fptr;
  202. /* Function: checks ferror(fptr) and aborts the program if there were
  203.  * errors; otherwise closes fptr.
  204.  */
  205. {       if (ferror(fptr) || fclose(fptr)==EOF)
  206.         IOerror();
  207. }
  208.  
  209.  
  210.  
  211.     char *
  212. maketemp(n)
  213.     int n;
  214. /* Create a unique filename using n and the process id and store it
  215.  * into the nth slot in tfnames.
  216.  * Because of storage in tfnames, tempunlink() can unlink the file later.
  217.  * Returns a pointer to the filename created.
  218.  */
  219. {
  220.     char *p = tfnames[n];
  221.  
  222.     if (!tfmade[n]) {
  223. #if has_tmpnam
  224.         if (!tmpnam(p))
  225. #else
  226.         VOID sprintf(p, "%sRCS%cXXXXXX", tmp(), 'A'+n);
  227.         if (!mktemp(p))
  228. #endif
  229.             faterror("can't make temporary file name");
  230.     }
  231.     tfmade[n] = true;
  232.     return p;
  233. }
  234.  
  235.     void
  236. tempunlink()
  237. /* Clean up maketemp() files.  May be invoked by signal handler.
  238.  */
  239. {
  240.     re